//: Playground - noun: a place where people can play

import UIKit

protocol P {
    func m1()
}

extension P {
    func m1() {
        print("e m1")
    }
    
    func m2() {
        print("e m2")
    }
    
    func m3() {
        print("e m2")
    }
}

struct S: P {
    func m1() {
        print("s m1")
    }
    
    func m2() {
        print("s m2")
    }
}

let s = S()
let p = s as P

s.m1()
s.m2()
s.m3()

p.m1()
p.m2()
p.m3()

//s m1
//s m2
//e m2

//s m1
//e m2
//e m2

/*
 1.实例:
    自身若实现协议方法则调用自身的方法
    自身若未实现协议种方法则调用协议拓展中对应方法
 
 2.协议:
    如果方法在协议本身中进行了定义:
        若自身定义了此方法则调用自身该方法
        若自身没有定义则调用协议拓展中对应方法
    如果方法在协议本身中没有定义(即为协议拓展中添加的方法)
        不管自身有没有实现此方法都会调用协议拓展中的默认实现
 
 注:“自身”为实现协议的Class、Struct等类型
 */
